package com.example.testapp.data.dao

import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.example.testapp.data.entity.BalanceProcessRecord
import java.time.LocalDateTime

/**
 * 账单处理记录数据访问对象
 */
@Dao
interface BalanceProcessRecordDao {

    /**
     * 插入账单处理记录
     * @param record 账单处理记录对象
     * @return 插入的ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(record: BalanceProcessRecord): Long

    /**
     * 批量插入账单处理记录
     * @param records 账单处理记录列表
     * @return 插入的ID列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(records: List<BalanceProcessRecord>): List<Long>

    /**
     * 更新账单处理记录
     * @param record 账单处理记录对象
     */
    @Update
    fun update(record: BalanceProcessRecord)

    /**
     * 删除账单处理记录
     * @param record 账单处理记录对象
     */
    @Delete
    fun delete(record: BalanceProcessRecord)

    /**
     * 软删除账单处理记录
     * @param id 账单处理记录ID
     * @param delAt 删除时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET del_flag = 1, del_at = :delAt, update_date = :delAt WHERE id = :id")
    fun softDelete(id: Long, delAt: LocalDateTime): Int

    /**
     * 根据账单ID软删除处理记录
     * @param balanceId 账单ID
     * @param delAt 删除时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET del_flag = 1, del_at = :delAt, update_date = :delAt WHERE balance_id = :balanceId")
    fun softDeleteByBalanceId(balanceId: Long, delAt: LocalDateTime): Int

    /**
     * 恢复软删除的账单处理记录
     * @param id 账单处理记录ID
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET del_flag = 0, del_at = NULL, update_date = :updateDate WHERE id = :id")
    fun restore(id: Long, updateDate: LocalDateTime): Int

    /**
     * 根据ID查询账单处理记录
     * @param id 账单处理记录ID
     * @return 账单处理记录对象
     */
    @Query("SELECT * FROM balance_process_record WHERE id = :id AND del_flag = 0")
    fun findById(id: Long): BalanceProcessRecord?

    /**
     * 根据账单ID查询处理记录
     * @param balanceId 账单ID
     * @return 处理记录列表
     */
    @Query("SELECT * FROM balance_process_record WHERE balance_id = :balanceId AND del_flag = 0 ORDER BY start_time DESC")
    fun findByBalanceId(balanceId: Long): List<BalanceProcessRecord>

    /**
     * 根据账单ID和处理类型查询最新的处理记录
     * @param balanceId 账单ID
     * @param processType 处理类型
     * @return 处理记录
     */
    @Query("SELECT * FROM balance_process_record WHERE balance_id = :balanceId AND process_type = :processType AND del_flag = 0 ORDER BY start_time DESC LIMIT 1")
    fun findLatestByBalanceIdAndType(balanceId: Long, processType: Int): BalanceProcessRecord?

    /**
     * 根据状态查询处理记录
     * @param status 处理状态
     * @return 处理记录列表
     */
    @Query("SELECT * FROM balance_process_record WHERE status = :status AND del_flag = 0 ORDER BY start_time DESC")
    fun findByStatus(status: Int): List<BalanceProcessRecord>

    /**
     * 查询需要重试的处理记录
     * @param now 当前时间
     * @return 需要重试的处理记录列表
     */
    @Query("SELECT * FROM balance_process_record WHERE status = 4 AND retry_count < max_retry_count AND next_retry_time <= :now AND del_flag = 0")
    fun findForRetry(now: LocalDateTime): List<BalanceProcessRecord>

    /**
     * 更新处理记录状态
     * @param id 处理记录ID
     * @param status 新状态
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET status = :status, update_date = :updateDate WHERE id = :id")
    fun updateStatus(id: Long, status: Int, updateDate: LocalDateTime): Int

    /**
     * 更新处理记录的重试信息
     * @param id 处理记录ID
     * @param retryCount 当前重试次数
     * @param nextRetryTime 下次重试时间
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET retry_count = :retryCount, next_retry_time = :nextRetryTime, update_date = :updateDate WHERE id = :id")
    fun updateRetryInfo(id: Long, retryCount: Int, nextRetryTime: LocalDateTime, updateDate: LocalDateTime): Int

    /**
     * 记录处理开始信息
     * @param id 处理记录ID
     * @param startTime 开始时间
     * @param status 处理状态（通常为处理中）
     * @param workerId WorkManager工作ID
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET start_time = :startTime, status = :status, worker_id = :workerId, update_date = :updateDate WHERE id = :id")
    fun recordStart(id: Long, startTime: LocalDateTime, status: Int, workerId: String, updateDate: LocalDateTime): Int

    /**
     * 记录处理结束信息
     * @param id 处理记录ID
     * @param endTime 结束时间
     * @param timeConsumed 处理耗时（毫秒）
     * @param status 处理状态（已完成或失败）
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET end_time = :endTime, time_consumed = :timeConsumed, status = :status, update_date = :updateDate WHERE id = :id")
    fun recordEnd(id: Long, endTime: LocalDateTime, timeConsumed: Int, status: Int, updateDate: LocalDateTime): Int

    /**
     * 记录处理错误信息
     * @param id 处理记录ID
     * @param errorCode 错误代码
     * @param errorMessage 错误消息
     * @param errorType 错误类型
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_process_record SET error_code = :errorCode, error_message = :errorMessage, error_type = :errorType, update_date = :updateDate WHERE id = :id")
    fun recordError(id: Long, errorCode: String, errorMessage: String, errorType: String, updateDate: LocalDateTime): Int
} 